from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from apps.course.models import CourseModel
from rest_framework import status
from django_redis import get_redis_connection
# Create your views here.

# drf中有用户校验和权限校验


class CartViews(APIView):
    # permission_classes = [IsAuthenticated,]
    def post(self,request):
        # 将前端需要添加到购物车中的数据，添加到reids中
        # redis写入数据，redis链接，当前用户
        user_id = request.user.id  #用户id
        # user_id = 1  #用户id
        # 从前端传递的参数中获取课程id
        course_id = request.data.get('course_id')
        # course_id = 1
        # 商品选中状态，默认是1     booler 值    1 true   0 false
        selected = 1
        # 需要判断，课程是否存在,数据库中是否存在课程
        try:
            CourseModel.objects.get(is_deleted=False,is_show=True,id=course_id)

            # 获取redis链接
            redis = get_redis_connection('cart')
            # 添加课程数据，到redis中
            redis.hset(f"cart_{user_id}",course_id,selected)
            # 添加完成后，获取当前用户的商品总数量
            cart_total = redis.hlen(f"cart_{user_id}")
            return Response({"message":"添加购物车成功","cart_total":cart_total},status=status.HTTP_200_OK)

        except CourseModel.DoesNotExist:
            print('添加购物车的课程不存在')
            return Response({"message":"课程不存在，添加购物车失败"},status=status.HTTP_400_BAD_REQUEST)

        # redis.hset('cart_{user_id}',课程id,是否选中)
        # return Response()
    def get(self,request):
        # 获取购物车数据
        # 通过用户id，获取对应所有淑
        user_id = request.user.id
        redis = get_redis_connection('cart')
        cart_hash = redis.hgetall(f"cart_{user_id}")

        if len(cart_hash)<1:
            return Response({"message":"购物车中没有数据..."},status=status.HTTP_400_BAD_REQUEST)
        # s = {b'1':b'1',b'2':b'1'}


        # 将redis中获取到的数据，进行转码处理，字典（byte字节）格式数据，转换为  (1，1)数据类型
        cart =[(int(key.decode()),(int(value.decode()))) for key,value in cart_hash.items()]
        # 【（1，1），（2，1），（3，1）】

        # 根据课程id，查询课程信息   id存在于cart中，，将cart中所有的id获取到，并添加到一个新的列表中
        course_id_list = [i[0] for i in cart]

        # 根据课程id列表，查询数据，   id__in 在非连续的范围
        course_list = CourseModel.objects.filter(is_show=True,is_deleted=False,id__in=course_id_list)

        data = []
        for course in course_list:
            data.append(
                {
                    "id":course.id,
                    "name":course.name,
                    # 获取图片的时候，不会自动添加访问前缀，  http://127.0.0.1:8000/uploads/ /course/course/1.png
                    "course_cover":"http://127.0.0.1:8000"+course.course_cover.url,
                    "price":course.price,
                    "discount":course.discount,
                    "course_type":course.course_type,
                    "credit":course.credit,
                    # 判断当前课程是否选中，  cart_hash   cart    1 选中   0  未选中
                    "selected": str(course.id).encode() in cart_hash and cart_hash[str(course.id).encode()].decode() == '1'
                }
            )

        # 获取redis购物车中的课程id
        # 通过课程id，从数据库中获取课程数据
        # 简化数据，并拼接返回
        return Response({"message":"查询购物车成功",'data':data},status=status.HTTP_200_OK)